#include "SocketThreadSimple.h"
using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
SocketThreadSimple::~SocketThreadSimple()
{
	PurgeOps();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void SocketThreadSimple::PurgeOps()
{
	OpSet::iterator anItr = mOpSet.begin();
	while(anItr!=mOpSet.end())
	{
		SocketOpPtr anOp = *anItr;
		anOp->Kill();
		++anItr;
	}
	mOpSet.clear();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void SocketThreadSimple::AddSocketOp(SocketOp *theOp)
{
	AutoCrit aCrit(mDataCrit);
	mOpSet.insert(theOp);
	theOp->mInSocketThread = true;
}

///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void SocketThreadSimple::RemoveSocketOp(SocketOp *theOp)
{
	AutoCrit aCrit(mDataCrit);
	mOpSet.erase(theOp);
	theOp->mInSocketThread = false;
}


///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void SocketThreadSimple::Pump(DWORD theWaitTime)
{
	AutoCrit aCrit(mDataCrit);
	OpSet::iterator anItr = mOpSet.begin();
	while(anItr!=mOpSet.end())
	{
		SocketOp* anOp = *anItr;
		if(DoOp(anOp))
			mOpSet.erase(anItr++);
		else
			++anItr;
	}

	aCrit.Leave();

	if(theWaitTime>=20)
		theWaitTime = 20;

	if(theWaitTime>0)
		mSignalEvent.WaitFor(theWaitTime);
}

///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void SocketThreadSimple::ThreadFunc()
{
	while(!mStopped)
		Pump(20);
}

